applyMiddlewate.spec.js ➔ ... ➔ ???   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 9
Bugs 0 Features 9
Metric Value
cc 1
c 9
b 0
f 9
nc 1
dl 0
loc 1
rs 10
nop 0
1
import test from 'ava';
2
import sinon from 'sinon';
3
import applyMiddleware from '../src/applyMiddleware';
4
5
const noop = _ => _;
6
7
test('applyTo is required', t => {
8
    t.throws(() => applyMiddleware());
9
});
10
11
test('applyTo is not a function', t => {
12
    const applyTo = 'oops';
13
    t.throws(() => applyMiddleware(applyTo));
14
});
15
16
test('no middleware returns default params', t => {
17
    const spyApplyTo = sinon.spy(noop);
18
19
    t.deepEqual(applyMiddleware(spyApplyTo), {});
20
    t.true(spyApplyTo.calledOnce);
21
    t.true(spyApplyTo.calledWithExactly({}));
22
});
23
24
test('no functional middleware returns default params', t => {
25
    const applyTo = sinon.spy(noop);
26
    const middlewares = [
27
        'test', undefined, {}, [], 123, null, NaN, /^/
28
    ];
29
30
    t.deepEqual(applyMiddleware(applyTo, middlewares), {});
31
    t.true(applyTo.calledOnce);
32
    t.true(applyTo.calledWithExactly({}));
33
});
34
35
test('one middleware', t => {
36
    const applyTo = sinon.spy(noop);
37
    const middleware = sinon.spy(noop);
38
39
    const options = { options: 'options' };
40
    const params = { params: 'params' };
41
    const resourceId = 'resourceId';
42
    const method = 'method';
43
44
    t.deepEqual(applyMiddleware(applyTo, [ middleware ], options, params, resourceId, method), params);
45
    t.true(applyTo.calledOnce);
46
    t.true(applyTo.calledWithExactly(params, options, params, resourceId, method));
47
    t.true(middleware.calledOnce);
48
49
    const middlewareSpyCall = middleware.getCall(0);
50
    t.true(middlewareSpyCall.args.length === 1);
51
    t.true(middlewareSpyCall.args[0] instanceof Function);
52
    t.falsy(middlewareSpyCall.thisValue);
53
    t.true(middlewareSpyCall.args[0].prototype === undefined);
54
});
55
56
test('multiple middlewares', t => {
57
    const applyTo = sinon.spy(noop);
58
    const middleware1 = sinon.spy(noop);
59
    const middleware2 = sinon.spy(noop);
60
61
    const options = { options: 'options' };
62
    const params = { params: 'params' };
63
    const resourceId = 'resourceId';
64
    const method = 'method';
65
66
    t.deepEqual(applyMiddleware(applyTo, [ middleware1, middleware2 ], options, params, resourceId, method), params);
67
    t.true(applyTo.calledOnce);
68
    t.true(applyTo.calledWithExactly(params, options, params, resourceId, method, options, params, resourceId, method));
69
    t.true(middleware1.calledOnce);
70
    t.true(middleware2.calledOnce);
71
72
    const middleware1SpyCall = middleware1.getCall(0);
73
    t.true(middleware1SpyCall.args.length === 1);
74
    t.true(middleware1SpyCall.args[0] instanceof Function);
75
    t.falsy(middleware1SpyCall.thisValue);
76
    t.true(middleware1SpyCall.args[0].prototype === undefined);
77
78
    const middleware2SpyCall = middleware2.getCall(0);
79
    t.true(middleware2SpyCall.args.length === 1);
80
    t.true(middleware2SpyCall.args[0] instanceof Function);
81
    t.falsy(middleware2SpyCall.thisValue);
82
    t.true(middleware2SpyCall.args[0].prototype === undefined);
83
});